// src/utils/request.ts

import axios from 'axios';
import type { AxiosInstance, AxiosResponse, AxiosError } from 'axios';

// 1. 创建一个自定义的 Axios 实例
const request: AxiosInstance = axios.create({
    baseURL: 'http://localhost:3000', // 你的后端 API 基础 URL
    timeout: 5000, // 请求超时时间
});

// 2. 添加请求拦截器
request.interceptors.request.use(
    (config) => {
        // 如果有 token，添加到请求头中
        const token = localStorage.getItem('token');
        if (token && config.headers) {
            config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
    },
    (error: AxiosError) => {
        console.error('请求发送失败:', error);
        // 直接返回一个被拒绝的 Promise
        return Promise.reject(error);
    }
);

// 3. 添加响应拦截器
request.interceptors.response.use(
    (response: AxiosResponse) => {
        // 成功响应通常直接返回数据
        return response;
    },
    (error: AxiosError) => {
        console.error('响应错误:', error);

        // 处理 HTTP 状态码错误
        if (error.response) {
            const status = error.response.status;
            switch (status) {
                case 401:
                    // 登录已过期，清除 token
                    localStorage.removeItem('token');
                    console.error('登录已过期，请重新登录');
                    break;
                case 403:
                    console.error('权限不足');
                    break;
                case 500:
                    console.error('服务器内部错误');
                    break;
                default:
                    console.error(`请求失败 (${status})`);
                    break;
            }
        } else if (error.code === 'ECONNABORTED') {
            // 请求超时错误
            console.error('请求超时');
        } else if (error.message === 'Network Error') {
            // 网络连接错误
            console.error('网络连接失败');
        } else {
            console.error('未知错误');
        }

        // 返回一个被拒绝的 Promise，以便在调用处捕获
        return Promise.reject(error);
    }
);

export default request;